<?php

/*
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
 *
 * == BEGIN LICENSE ==
 *
 * Licensed under the terms of any of the following licenses at your
 * choice:
 *
 *  - GNU General Public License Version 2 or later (the "GPL")
 *    http://www.gnu.org/licenses/gpl.html
 *
 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
 *    http://www.gnu.org/licenses/lgpl.html
 *
 *  - Mozilla Public License Version 1.1 or later (the "MPL")
 *    http://www.mozilla.org/MPL/MPL-1.1.html
 *
 * == END LICENSE ==
 *
 * This is the File Manager Connector for PHP.
 */

function GetFolders($resourceType, $currentFolder)
{
    // Map the virtual path to the local server path.
    $sServerDir = ServerMapFolder($resourceType, $currentFolder, 'GetFolders');

    // Array that will hold the folders names.
    $aFolders = array();

    $oCurrentFolder = opendir($sServerDir);

    while ($sFile = readdir($oCurrentFolder)) {
        if ($sFile != '.' && $sFile != '..' && is_dir($sServerDir . $sFile))
            $aFolders[] = '<Folder name="' . ConvertToXmlAttribute($sFile) . '" />';
    }

    closedir($oCurrentFolder);

    // Open the "Folders" node.
    echo "<Folders>";

    natcasesort($aFolders);
    foreach ($aFolders as $sFolder)
        echo $sFolder;

    // Close the "Folders" node.
    echo "</Folders>";
}

function GetFoldersAndFiles($resourceType, $currentFolder)
{
    // Map the virtual path to the local server path.
    $sServerDir = ServerMapFolder($resourceType, $currentFolder, 'GetFoldersAndFiles');

    // Arrays that will hold the folders and files names.
    $aFolders = array();
    $aFiles = array();

    $oCurrentFolder = opendir($sServerDir);

    while ($sFile = readdir($oCurrentFolder)) {
        if ($sFile != '.' && $sFile != '..') {
            if (is_dir($sServerDir . $sFile))
                $aFolders[] = '<Folder name="' . ConvertToXmlAttribute($sFile) . '" />';
            else {
                $iFileSize = @filesize($sServerDir . $sFile);
                if (!$iFileSize) {
                    $iFileSize = 0;
                }
                if ($iFileSize > 0) {
                    $iFileSize = round($iFileSize / 1024);
                    if ($iFileSize < 1)
                        $iFileSize = 1;
                }

                $aFiles[] = '<File name="' . ConvertToXmlAttribute($sFile) . '" size="' . $iFileSize . '" />';
            }
        }
    }

    // Send the folders
    natcasesort($aFolders);
    echo '<Folders>';

    foreach ($aFolders as $sFolder)
        echo $sFolder;

    echo '</Folders>';

    // Send the files
    natcasesort($aFiles);
    echo '<Files>';

    foreach ($aFiles as $sFiles)
        echo $sFiles;

    echo '</Files>';
}

function CreateFolder($resourceType, $currentFolder)
{
    if (!isset($_GET)) {
        global $_GET;
    }
    $sErrorNumber = '0';
    $sErrorMsg = '';

    if (isset($_GET['NewFolderName'])) {
        $sNewFolderName = $_GET['NewFolderName'];
        $sNewFolderName = SanitizeFolderName($sNewFolderName);

        if (strpos($sNewFolderName, '..') !== FALSE)
            $sErrorNumber = '102';  // Invalid folder name.
 else {
            // Map the virtual path to the local server path of the current folder.
            $sServerDir = ServerMapFolder($resourceType, $currentFolder, 'CreateFolder');

            if (is_writable($sServerDir)) {
                $sServerDir .= $sNewFolderName;

                $sErrorMsg = CreateServerFolder($sServerDir);

                switch ($sErrorMsg)
                {
                    case '' :
                        $sErrorNumber = '0';
                        break;
                    case 'Invalid argument' :
                    case 'No such file or directory' :
                        $sErrorNumber = '102';  // Path too long.
                        break;
                    default :
                        $sErrorNumber = '110';
                        break;
                }
            }
            else
                $sErrorNumber = '103';
        }
    }
    else
        $sErrorNumber = '102';

    // Create the "Error" node.
    echo '<Error number="' . $sErrorNumber . '" originalDescription="' . ConvertToXmlAttribute($sErrorMsg) . '" />';
}

function FileUpload($resourceType, $currentFolder, $sCommand)
{
    if (!isset($_FILES)) {
        global $_FILES;
    }
    $sErrorNumber = '0';
    $sFileName = '';

    if (isset($_FILES['NewFile']) && !is_null($_FILES['NewFile']['tmp_name'])) {
        global $Config;

        $oFile = $_FILES['NewFile'];

        // Map the virtual path to the local server path.
        $sServerDir = ServerMapFolder($resourceType, $currentFolder, $sCommand);

        // Get the uploaded file name.
        $sFileName = $oFile['name'];
        $sFileName = SanitizeFileName($sFileName);

        $sOriginalFileName = $sFileName;

        // Get the extension.
        $sExtension = substr($sFileName, ( strrpos($sFileName, '.') + 1));
        $sExtension = strtolower($sExtension);

        // add by zhangwentao <zwttmac@qq.com>        
        $sOriginalFileName = $sFileName = GetRandID($sExtension);



        if (isset($Config['SecureImageUploads'])) {
            if (( $isImageValid = IsImageValid($oFile['tmp_name'], $sExtension) ) === false) {
                $sErrorNumber = '202';
            }
        }

        if (isset($Config['HtmlExtensions'])) {
            if (!IsHtmlExtension($sExtension, $Config['HtmlExtensions']) &&
                    ( $detectHtml = DetectHtml($oFile['tmp_name']) ) === true) {
                $sErrorNumber = '202';
            }
        }

        // Check if it is an allowed extension.
        if (!$sErrorNumber && IsAllowedExt($sExtension, $resourceType)) {
            $iCounter = 0;

            while (true) {
                $sFilePath = $sServerDir . $sFileName;

                if (is_file($sFilePath)) {
                    $iCounter++;
                    $sFileName = RemoveExtension($sOriginalFileName) . '(' . $iCounter . ').' . $sExtension;
                    $sErrorNumber = '201';
                } else {
                    move_uploaded_file($oFile['tmp_name'], $sFilePath);

                    if (is_file($sFilePath)) {
                        if (isset($Config['ChmodOnUpload']) && !$Config['ChmodOnUpload']) {
                            break;
                        }

                        $permissions = 0777;

                        if (isset($Config['ChmodOnUpload']) && $Config['ChmodOnUpload']) {
                            $permissions = $Config['ChmodOnUpload'];
                        }

                        $oldumask = umask(0);
                        chmod($sFilePath, $permissions);
                        umask($oldumask);
                    }

                    break;
                }
            }

            if (file_exists($sFilePath)) {
                //previous checks failed, try once again
                if (isset($isImageValid) && $isImageValid === -1 && IsImageValid($sFilePath, $sExtension) === false) {
                    @unlink($sFilePath);
                    $sErrorNumber = '202';
                } else if (isset($detectHtml) && $detectHtml === -1 && DetectHtml($sFilePath) === true) {
                    @unlink($sFilePath);
                    $sErrorNumber = '202';
                }
            }
        }
        else
            $sErrorNumber = '202';
    }
    else
        $sErrorNumber = '202';
    ####### add by walton 动态上传fck图片文件路径按日期#######
    if ($sCommand == 'QuickUpload') {
        $ymd = date('Y', time()) . '/' . date('m', time());
        $currentFolder = $currentFolder . '/' . $ymd . '/';
    }
    ####### add over #######

    $sFileUrl = CombinePaths(GetResourceTypePath($resourceType, $sCommand), $currentFolder);
    $sFileUrl = CombinePaths($sFileUrl, $sFileName);

    SendUploadResults($sErrorNumber, $sFileUrl, $sFileName);

    exit;
}

function GetRandID($prefix)
{
    //第一步:初始化种子
    //microtime(); 是个数组
    $seedstr = split(" ", microtime(), 5);
    $seed = $seedstr[0] * 10000;
    //第二步:使用种子初始化随机数发生器
    srand($seed);
    //第三步:生成指定范围内的随机数
    $random = rand(1, 10000);
    $date = '/' . date('Y', time()) . '/' . date('md', time()) . '/';

    $filename = date("dHis", time()) . $random . '.' . $prefix;

    return $filename;
}

?>
